package com.yequan.work;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.Stack;

/**
 * @author yequan
 * @date 2022/02/28 13:14
 **/
public class DataUtil {

    private static Logger logger = LoggerFactory.getLogger(DataUtil.class);
    public static final char[] ARRAY = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

    /**
     * 设置sql的limit
     *
     * @param page
     * @param page_size
     * @param paramMap
     */
    public static void setLimitInfo(int page, int page_size,
                                    Map<String, Object> paramMap) {
        int from = ((page < 1 ? 1 : page) - 1) * page_size;
        paramMap.put("start", from);
        paramMap.put("end", page_size);
    }

    /**
     * 10进制转换为62进制，用于rowkey中时间戳的压缩
     * 当前时间（2016年9月）转换62进制后为7位，而7位62进制数据足以表示100年后的时间戳，所以不做位数补齐
     *
     * @param number
     * @return
     */
    public static String _10_to_62(long number){
        Long rest=number;
        Stack<Character> stack=new Stack<Character>();
        StringBuilder result=new StringBuilder(0);
        while(rest!=0){
            stack.add(ARRAY[new Long((rest-(rest/62)*62)).intValue()]);
            rest=rest/62;
        }
        for(;!stack.isEmpty();){
            result.append(stack.pop());
        }
        return result.toString();

    }

    /**
     * 62进制转10进制
     *
     * @param sixty_str
     * @return
     */
    public static long _62_to_10(String sixty_str){
        long multiple=1;
        long result=0;
        Character c;
        for(int i=0;i<sixty_str.length();i++){
            c=sixty_str.charAt(sixty_str.length()-i-1);
            result+=_62_value(c)*multiple;
            multiple=multiple*62;
        }
        return result;
    }

    private static int _62_value(Character c){
        for(int i=0;i<ARRAY.length;i++){
            if(c==ARRAY[i]){
                return i;
            }
        }
        return -1;
    }
}
